package org.springframework.social.instagram.api.impl;
import java.io.IOException;
import java.util.Map;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.social.instagram.api.InstagramApiException;
import org.springframework.web.client.DefaultResponseErrorHandler;
public class InstagramErrorHandler extends DefaultResponseErrorHandler {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
Map<String, Object> errorDetails = extractErrorDetailsFromResponse(response);
int code = Integer.valueOf(String.valueOf(errorDetails.get("code"))).intValue();
String errorType = String.valueOf(errorDetails.get("error_type"));
String message = String.valueOf(errorDetails.get("error_message"));
throw new InstagramApiException(code, errorType, message);
}
@SuppressWarnings("unchecked")
private Map<String, Object> extractErrorDetailsFromResponse(ClientHttpResponse response) throws IOException {
ObjectMapper mapper = new ObjectMapper(new JsonFactory());
Map<String, Object> responseMap = mapper.<Map<String, Object>>readValue(response.getBody(), new TypeReference<Map<String, Object>>() {});
if(responseMap.containsKey("meta")) {
Map<String, Object> meta = (Map<String, Object>) responseMap.get("meta");
if(Integer.valueOf(String.valueOf(meta.get("code"))).intValue() > 200) {
return meta;
}
}
return null;
}
}